package com.cyy.map;

/**
 * 映射接口 Map
 * @author 会玩的洋洋
 * @since 2022-02-27
 * @param <K>
 * @param <V>
 */
public interface Map<K, V> {
    /**
     * 映射中元素的数量
     * @return int
     */
    int size();

    /**
     * 判断映射中是否为空
     * @return boolean
     */
    boolean isEmpty();

    /**
     * 清空映射中的元素
     */
    void clear();

    /**
     * 向映射中添加元素
     * @param key 键
     * @param value 值
     * @return V 上一个 key 相同的 value
     */
    V put(K key, V value);

    /**
     * 通过key获取value
     * @param key 键
     * @return V
     */
    V get(K key);

    /**
     * 通过 key 删除映射中的值
     * @param key 键
     * @return V 删除的元素 value
     */
    V remove(K key);

    /**
     * 判断是否存在key
     * @param key 要判断的key
     * @return boolean
     */
    boolean containsKey(K key);

    /**
     * 判断是否存在 value
     * @param value 要判断的value
     * @return boolean
     */
    boolean containsValue(V value);

    /**
     * 对映射进行遍历
     * @param visitor 遍历类
     */
    void traversal(Visitor<K, V> visitor);

    abstract class Visitor<K, V> {
        boolean stop;

        /**
         * 自定义遍历方法
         * @param key 键
         * @param value 值
         * @return boolean
         */
        public abstract boolean visit(K key, V value);
    }
}
